#include <bits/stdc++.h>
#define ll long long
#define i28 __int128
using namespace std;

int read(){
    int x=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')w=-w,ch=getchar();
    while(ch>='0'&&ch<='9')x=10*x+ch-'0',ch=getchar();
    return x*w;
}
inline void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
struct car{
    int d,v,a;
}c[100100];
int n,m,L,V;
int p[100100];
bool b[1000100];
bool b2[1000100];
vector<int>x[1000100];
vector<int>y;
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T=read();
    while(T--){
        memset(b,false,sizeof(b));
        n=read(),m=read(),L=read(),V=read();
        for(int i=1;i<=n;i++)
            c[i].d=read(),c[i].v=read(),c[i].a=read();
        for(int i=1;i<=m;i++)
            p[i]=read();
        sort(p+1,p+m+1);
        int ans1=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(c[i].d<p[j]){
                    if(c[i].v*c[i].v+2*c[i].a*(p[j]-c[i].d)>V*V){
                        ans1++;
                        break;
                    }
                }
            }
        }
        int ans2=1000000000;
        bool isAB=true;
        for(int i=1;i<=n;i++){
            if(c[i].a<0)isAB=false;
        }
        if(isAB){
            ans2=1;
        }
        else{int cnt=1;
        for(int i=1;i<=n;i++){
            bool f=false;
            for(int j=1;j<=m;j++){
                if(c[i].d<p[j]){
                    if(c[i].v*c[i].v+2*c[i].a*(p[j]-c[i].d)>V*V){
                        x[cnt].push_back(p[j]);
                        y.push_back(p[j]);
                        f=true;
                    }
                }
            }
            if(!f){
                cnt++;
            }
        }
        cnt--;
        sort(y.begin(),y.end());
        y.erase(unique(y.begin(),y.end()),y.end());
        int l=y.size();
        for(int i=1;i<=l;i++){
            int ans=0;
            memset(b,false,sizeof(b));
            for(int j=1;j<=i;j++){
                for(auto z:y){
                    if(b[z])continue;
                    bool flag=true;
                    for(int k=1;k<=cnt;k++){
                        if(!b2[k]){flag=false;break;}
                    }
                    if(flag){
                        break;
                    }
                    ans++;
                    b[z]=true;
                    for(int k=1;k<=cnt;k++){
                        for(auto w:x[k]){
                            if(!b2[k]&&w==z){
                                b2[k]=true;
                            }
                        }
                    }
                }
            }ans2=min(ans2,ans);
        }
        }
        printf("%d %d\n",ans1,m-ans2);
    }
    return 0;
}
